package cn.learn.httpclient;

import lombok.extern.slf4j.Slf4j;
import okhttp3.*;

import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.concurrent.TimeUnit;

/**
 * @author huangyezhan
 * @version 1.0
 * @date 2021年08月30日17:17
 */
@Slf4j
public class OkHttpResponseUtil {
    private OkHttpResponseUtil() {}

    /**
     * 设置请求参数以及请求参数的格式
     */
    //private static final MediaType MEDIATYPE = MediaType.parse("application/json, text/plain, */*");
    private static final MediaType MEDIATYPE = MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_VALUE);

    private static final OkHttpClient client = new OkHttpClient.Builder()
            // 设置连接超时时间
            .connectTimeout(2, TimeUnit.MINUTES)
            // 设置读取超时时间
            .readTimeout(5, TimeUnit.MINUTES)
            .build();


    /**
     * get请求，请求的参数放在url里面
     *
     * @param url        请求url
     * @param tokenName  token的名称
     * @param tokenValue token的值
     * @return
     */
    public static String getOkhttp(String url, String tokenName, String tokenValue) {
        //生成请求头
        Request.Builder builder = setRequestHeader(url, tokenName, tokenValue);
        //生成请求
        Request request = builder.build();
        //返回请求结果
        return execute(request);
    }

    public static String getOkhttp(String url) {
        return getOkhttp(url, null, null);
    }


    /**
     * post请求
     *
     * @param jsonParams json格式的参数
     * @param url        请求url
     * @param tokenName  token的名称
     * @param tokenValue token的值
     * @return
     */
    public static String postOkHttp(String jsonParams, String url, String tokenName, String tokenValue) {
        //设置参数以及参数的格式
        RequestBody requestBody = RequestBody.create(MEDIATYPE, jsonParams);
        //生成请求头
        Request.Builder builder = setRequestHeader(url, tokenName, tokenValue);
        //生成请求
        Request request = builder.post(requestBody).build();
        //返回请求结果
        return execute(request);
    }

    public static String postOkHttp(String url) {
        return postOkHttp(null, url, null, null);
    }

    public static String postOkHttp(String jsonParams, String url) {
        return postOkHttp(jsonParams, url, null, null);
    }


    /**
     * put请求
     *
     * @param jsonParams json格式的参数
     * @param url        请求url
     * @param tokenName  token的名称
     * @param tokenValue token的值
     * @return
     */
    public static String putOkHttp(String jsonParams, String url, String tokenName, String tokenValue) {
        //设置参数以及参数的格式
        RequestBody requestBody = RequestBody.create(MEDIATYPE, jsonParams);
        //生成请求头
        Request.Builder builder = setRequestHeader(url, tokenName, tokenValue);
        //生成请求
        Request request = builder.put(requestBody).build();
        //返回请求结果
        return execute(request);
    }

    public static String putOkHttp(String jsonParams, String url) {
        return putOkHttp(jsonParams, url, null, null);
    }



    /**
     * 生成请求头
     *
     * @param url           请求路径
     * @param tokenName     token的名称
     * @param tokenValue    token的
     * @return
     */
    private static Request.Builder setRequestHeader(String url, String tokenName, String tokenValue) {
        //生成请求参数,动态添加token请求头
        Request.Builder header = new Request.Builder()
                .url(url)
                .header("User-Agent", "OkHttp Headers.java")
                .addHeader("Accept", "application/json, text/plain, */*")
                .addHeader("Accept", "application/vnd.github.v3+json");
        if (tokenName != null) {
            header.addHeader(tokenName, tokenValue);
        }
        return header;
    }

    /**
     * 执行同步请求后，返回的结果
     *
     * @param request 请求对象
     */
    private static String execute(Request request) {
        //OkHttpClient client = new OkHttpClient();
        Call call = client.newCall(request);

        try (Response response = call.execute()) {
            String string = response.body().string();
            response.close();
            return string;
        } catch (IOException e) {
            if (e instanceof SocketTimeoutException) {
                return "failure：超时异常 " + e.getMessage();
            }
            if (e instanceof ConnectException) {
                return "failure：连接异常 " + e.getMessage();
            }
            log.debug("异常问题：",e);
        }
        return null;
    }


}
